// axios 全局基础配置
import axios from 'axios';
// 引入白名单
import whiteConfig from './service.config'

// 秘钥用md5加密
import md5 from 'md5'

// 引入router
import { useRouter } from 'vue-router'

// 1.0 创建一个对象 后面的接口用request来发

let request = axios.create({
    baseURL: 'http://localhost:8000', // 基础url
    timeout: 30 * 1000, // 超时时间
    responseType:'json', // 响应类型
    headers:{ // 自定义header
        "a": "123"
    }
})

// 2.0 请求拦截器 token秘钥的设置
request.interceptors.request.use((config)=>{
    // token,秘钥的设置  传给后端用的
    // 1.0 设置哪些接口需要token 新建文件 service.config.js
    let whiteList = whiteConfig.whiteList
    let url = config.url;
    let token = localStorage.getItem('token')
    //2.0 判断在不在里面 并且token有值证明登录了 不在的话需要加toekn
    if(whiteList.indexOf(url) == -1 && token){
        config.headers.token = token;  // 在请求头里面设置toekn
    }
    // 2.5 当然为了更安全 可以增加一些秘钥 比如秘钥+md5算法
    let secret = md5(whiteConfig.secretID + new Date().toJSON() )
    config.headers.secret = secret

    // 3.0 返回config
    return config;
},error => {
    // 请求错误处理处理 先不管
    return Promise.reject(new Error(error))
})

// 3.0 响应拦截器
request.interceptors.response.use((res)=>{
    // 响应统一处理 这是成功的拦截  不是标准的状态码是后端给我们的状态码 比如res.data.code:200
    // 1.0 获取code码
    let status = res.data.code || 200;
    let message = res.data.msg || '未知错误';
    // 特殊状态码处理
    if(status == 401){
        alert('你没有权限')
        // 这时候就需要重新登录了
        const router = useRouter() // // 返回路由器实例。相当于在模板中使用 $router。
        router.push('/login')
        return
    }
    if(status != 200){
        alert('错误码' + status + '   ' + message)
        return Promise.reject(new Error(message)) // 可以让catch到 再处理
    }
    return res

},error=>{
    //  响应失败的拦截
    // 比如alert  项目中我们一般用组件库的弹框提示
    alert('你出错了'+error)
    return Promise.reject(new Error(error))
})

// 最后把封装好的 暴露出去
export default request

